"""
Python数字列表排序方法详解

Python提供了多种对数字列表进行排序的方法，包括内置函数和自定义排序。
"""

# 示例数字列表
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]

print("原始列表:", numbers)
print()

# 1. 使用sorted()函数进行排序（返回新列表）
print("1. 使用sorted()函数排序")
sorted_numbers = sorted(numbers)
print("升序排序:", sorted_numbers)

# 降序排序
sorted_desc = sorted(numbers, reverse=True)
print("降序排序:", sorted_desc)
print()

# 2. 使用list.sort()方法进行原地排序
print("2. 使用list.sort()方法排序")
numbers_copy = numbers.copy()  # 创建副本以免修改原列表
numbers_copy.sort()
print("升序排序:", numbers_copy)

numbers_copy_desc = numbers.copy()
numbers_copy_desc.sort(reverse=True)
print("降序排序:", numbers_copy_desc)
print()

# 3. 使用key参数进行自定义排序
print("3. 使用key参数自定义排序")

# 按绝对值排序
abs_sorted = sorted(numbers, key=abs)
print("按绝对值排序:", abs_sorted)

# 按数字的平方排序
square_sorted = sorted(numbers, key=lambda x: x**2)
print("按平方值排序:", square_sorted)
print()

# 4. 复杂数字列表的排序
print("4. 复杂数字列表排序示例")

# 包含负数和浮点数的列表
mixed_numbers = [3.14, -2, 0, 42, -3.14, 1.618, -1]
print("混合数字列表:", mixed_numbers)

# 默认排序
mixed_sorted = sorted(mixed_numbers)
print("默认排序:", mixed_sorted)

# 按绝对值排序
mixed_abs_sorted = sorted(mixed_numbers, key=abs)
print("按绝对值排序:", mixed_abs_sorted)
print()

# 5. 性能比较和注意事项
print("5. 性能比较和注意事项")

# sorted() vs sort() 性能差异
import time
from unittest.main import main

large_list = list(range(10000, 0, -1))  # 创建一个大列表

# 测试sorted()性能
start_time = time.time()
sorted_result = sorted(large_list)
sorted_time = time.time() - start_time

# 测试sort()性能  
start_time = time.time()
large_list_copy = large_list.copy()
large_list_copy.sort()
sort_time = time.time() - start_time

print(f"sorted() 耗时: {sorted_time:.6f} 秒")
print(f"sort()   耗时: {sort_time:.6f} 秒")
print("注意: sort()是原地排序，通常比sorted()稍快")
print()

# 6. 稳定排序特性
print("6. 稳定排序特性")

# 包含重复值的复杂数据
data = [(3, 'apple'), (1, 'banana'), (2, 'cherry'), (1, 'date')]
print("原始数据:", data)

# 按数字排序（稳定排序保持相同数字的原始顺序）
sorted_data = sorted(data, key=lambda x: x[0])
print("按数字排序:", sorted_data)
print("注意: Python的排序是稳定的，相同键值的元素保持原始顺序")
print()

# 7. 其他排序技巧
print("7. 其他排序技巧")

# 使用operator模块
import operator

# 按第二个元素排序（如果存在）
pairs = [(1, 5), (3, 2), (2, 8), (4, 1)]
sorted_pairs = sorted(pairs, key=operator.itemgetter(1))
print("按元组第二个元素排序:", sorted_pairs)

# 多重排序条件
complex_data = [(2, 'b'), (1, 'a'), (2, 'a'), (1, 'b')]
# 先按数字升序，再按字母升序
multi_sorted = sorted(complex_data, key=lambda x: (x[0], x[1]))
print("多重条件排序:", multi_sorted)
print()

print("总结:")
print("- sorted()返回新列表，sort()原地修改")
print("- 使用key参数可以实现自定义排序规则")  
print("- Python排序是稳定的（相同键值保持原始顺序）")
print("- 对于大数据集，sort()通常比sorted()稍快")
print("- 可以使用lambda函数或operator模块进行复杂排序")
if __name__ == "__main__":
    print("hello")
